14-3 ヶe

Request.Form 和 Request.QueryString 都是用來存放用戶端在表單填入的資訊。若表單的傳輸方式是 post,則我們可在 ASP 程式碼內以下列方式讀出表單的輸入值: 輸入資料 = Request.Form("欄位名稱") 若表單的傳輸方式是 get,則我們可用下列方式讀出表單輸入值: 輸入資料 = Request.QueryString("欄位名稱") 事實上,無論是 post 或 get,只要欄位名稱不重複,我們都可以用下列簡寫方式讀出表單的輸入值: 輸入資料 = Request("欄位名稱") 這是因為 Request("欄位名稱") 在未給定 Collection 時,會嘗試先讀取 Request.QueryString("欄位名稱"),若成功,則停止;若失敗,則會再嘗試讀取 Request.Form("欄位名稱")。

下列範例說明如何經由 Request.Form 或 Request.QueryString 取得表單資料,你可以選用不同的傳輸方式(get 或是 post),並檢視由 ASP 程式碼讀取的表單輸入值,範例如下:

Example(request/formData.asp):

上述範例的原始檔如下:

原始檔(request/formData.asp):(灰色區域按兩下即可拷貝)
<%@language=JScript%>
<%title="經由 Request.Form 或 Request.QueryString 傳送表單資料的範例"%>
<!--#include file="../head.inc"-->
<hr>

<form action="formData.asp?xxx=yyy&aaa=bbb" name="myform">
<ul>
<li>您的大名:<input name="your_name" value="鄭海龍">
<li>最帥的男明星 (單選):
	<input type="radio" name="singer" value="吳尊" checked>吳尊
	<input type="radio" name="singer" value="林志穎">林志穎
	<input type="radio" name="singer" value="郭品超">郭品超
	<input type="radio" name="singer" value="言承旭">言承旭
<li>營養的課 (複選):
	<input type="checkbox" name="course" value="資料結構">資料結構
	<input type="checkbox" name="course" value="離散數學" checked>離散數學
	<input type="checkbox" name="course" value="工程數學">工程數學
	<input type="checkbox" name="course" value="數值方法" checked>數值方法
<li>最喜歡的運動 (單選):
	<select name="single_choice"> 
	<option value="網球" selected>網球
	<option value="蝦球">蝦球
	<option value="鉛球">鉛球
	<option value="Yoyo球">Yoyo球
	</select>
<li>去過的地方 (複選):
	<select name="multiple_choice" size=3 multiple>
	<option value="San Francisco" selected>San Francisco
	<option value="Los Angeles">Los Angeles
	<option value="Boston" selected>Boston
	<option value="Seoul">Seoul
	<option value="Tokyo">Tokyo
	</select>
<li>我還有話要說:<br>
<textarea name="comments" cols=60 rows=3>
這個問卷很有趣...
只能意會,不能言傳...
</textarea>
</ul>
<center>
<input type="button" value="經由 get 送出" onClick="this.form.method='get'; this.form.submit()">
<input type="button" value="經由 post 送出" onClick="this.form.method='post'; this.form.submit()"><br>
(需按送出後,才可以看到下面資料喔!)
</center>
</form>

<h3 align=center>由 ASP 讀取到的表單資料</h3>
<!--#include file="../listdict.inc"-->
<p><% listdict(Request.QueryString, "Request.QueryString"); %>
<p><% listdict(Request.Form, "Request.Form"); %>

<hr>
<!--#include file="../foot.inc"-->

在上述範例中,我們可以觀察到下列事項:

Hint
如果你的表單同時用到 get 和 post 兩種傳送方法,就最好不要用 Request("欄位名稱") 的簡寫方式,以免造成錯誤。

如果你的欄位名稱在表單中有所重複,那麼可用下列方法讀出:

Request.QueryString(name)(index) Request.Form(name)(index) 其中

Hint
請特別注意,這裡的索引值是從 1 開始,而不是 0。

若有重複欄位,但未採用 index 來指定所要讀取的值時,則 ASP 會讀到多個值所形成的字串,其中每一個值都以逗點分開。例如,下列網頁是執行

example/request/parseQueryString.asp?xyz=777&xyz=888&xyz=999&abc=111&abc=222&pqr=333
的結果:

Example(request/parseQueryString.asp?xyz=777&xyz=888&xyz=999&abc=111&abc=222&pqr=333):

上述範例的原始檔如下:

原始檔(request/parseQueryString.asp):(灰色區域按兩下即可拷貝)
<%@language=JScript%>
<%title="如何解析 Request.QueryString 表單資料的重複欄位"%>
<!--#include file="../head.inc"-->
<hr>

<table border=1 align=center>
<tr>
<th bgcolor=999999>Name<th bgcolor=999999>出現次數<th bgcolor=999999>解析結果</tr> 
<%
var Enum=new Enumerator(Request.QueryString);
for (Enum.moveFirst(); !Enum.atEnd(); Enum.moveNext()){
	Response.Write("<tr>");
	Response.Write("<td>"+Enum.item());
	Response.Write("<td>"+Request.QueryString(Enum.item()).count);
	Response.Write("<td>Request.QueryString("+Enum.item()+")="+Request.QueryString(Enum.item())+"<br>");
	for (i=1; i<=Request.QueryString(Enum.item()).count; i++)
		Response.Write("Request.QueryString("+Enum.item()+")("+i+")="+Request.QueryString(Enum.item())(i)+"<br>");
}
%>   
</table>

<hr>
<!--#include file="../foot.inc"-->


JScript 程式設計與應用:用於伺服器端的 ASP 環境